#ifndef MOTOR_CONTROL_H
#define MOTOR_CONTROL_H
#include "stm32f4xx_hal.h"

/*


=============old================
--------------------模式设想-------------------------

  左(sw1)  上(1)	  中(3)	      下(2)
右(sw2)				
上(1)	拨杆1单控	拨杆4单控	前倾模式
中(3)	拨杆2单控	拨杆5单控	左右模式
下(2)	拨杆3单控	拨杆6单控	停止

单控模式下使用任一摇杆：向上——伸长；向下——收缩
单控模式下同时使两个摇杆：向上——全体电机伸长；向下——全体电机收缩


前倾模式下使用任一摇杆：向上——前倾；向下——前倾回正
左右倾模式下使用任一摇杆：向左——左倾/右倾回正；向右——右倾/左倾回正
前倾或左右倾模式下同时使用两个摇杆向下：状态归位一



====================new==================
--------------------模式设想-------------------------

  左(sw1)  上(1)	  中(3)	      下(2)
右(sw2)				
上(1)	拨杆1单控	拨杆4单控	斜倾模式
中(3)	拨杆2单控	拨杆5单控	垂直运动模式
下(2)	拨杆3单控	拨杆6单控	停止

单控模式下使用任一摇杆：向上——伸长；向下——收缩
单控模式下同时使两个摇杆：向上——全体电机伸长；向下——全体电机收缩

斜倾模式下 左摇杆向前前倾，向后前倾回正，向左左倾/右倾回正，向右右倾/左倾回正
           任一摇杆斜向左上复合运动
斜倾模式下同时使用右摇杆向下：状态归位一;右摇杆向上，进入第二个初始状态

垂直模式下 任意摇杆向上 向上运动 向下 向下运动
           两个摇杆向下 状态归位二



任意模式下进入停止模式立即停止所有电机运动


*/

//拨杆buff[5]编码
#define RC_SW_DD 0xA8  //down down
#define RC_SW_DM 0xB8  //down middle
#define RC_SW_DU 0x98  //down up
#define RC_SW_MD 0xE8  //middle down
#define RC_SW_MM 0xF8  //middle middle
#define RC_SW_MU 0xD8  //middle up
#define RC_SW_UD 0x68  //up down
#define RC_SW_UM 0x78  //up middle
#define RC_SW_UU 0x58  //up up




//拨杆模式设置
typedef enum{
    ROD_1 = 0,
    ROD_2,
    ROD_3,
    ROD_4,
    ROD_5,
    ROD_6,
    TILTED_MODE,//斜倾模式
    VERTICAL_MODE,//垂直模式
    STOP_MODE,//停止模式
} Control_mode;

//装置当前状态
typedef enum{
    Initial_bend_statu_1 = 0,//第一版 侧屈初始状态
    Initial_lift_statu_1,    //第一版 升降初始状态
    Initial_bend_statu_2,    //第二版 侧屈初始状态
    Initial_lift_statu_2,    //第二版 升降初始状态
    Alone_Control_statu,    //单控
    Farward_statu_1,     //前倾1
    Farward_statu_2,     //前倾2
    Left_statu_1,        //左倾1
    Left_statu_2,        //左倾2
    Right_statu_1,       //右倾1
    Right_statu_2,       //右倾2
    Up_statu,          //上升
    Complex_statu,     //复合
} Curren_statu;

//摇杆状态
typedef enum{
    Joystick_R = 0,//右状态
    Joystick_L,    //左状态
    Joystick_U,    //上状态
    Joystick_D,    //下状态
    Upper_left,    //左上状态
    Down_right,     //右下状态
    None,          //无状态
} Remote_statu;

//整机状态
typedef struct
{
    Control_mode MODE_flag;//遥控器状态
    Curren_statu Statu;//装置当前状态
    Remote_statu RC_L_statu;//左摇杆状态
    Remote_statu RC_R_statu;//右摇杆状态
    uint32_t time_count;//计时器,0.001s
} Remote_t;


void FIRST_Origin_state_bend(Remote_t *remote);
void FIRST_Origin_state_lift(Remote_t *remote);
void FrontBend_1(Remote_t *remote);
void FrontBend_back_1(Remote_t *remote);
void RightBend_1(Remote_t *remote);
void RightBend_back_1(Remote_t *remote);
void LeftBend_1(Remote_t *remote);
void LeftBend_back_1(Remote_t *remote);
void UP30_1(Remote_t *remote);
void DOWN30_1(Remote_t *remote);
void complex_move_1(Remote_t *remote);
void complex_back_1(Remote_t *remote);

void SECOND_Origin_state_bend(Remote_t *remote);
void FrontBend_2(Remote_t *remote);
void FrontBend_back_2(Remote_t *remote);
void RightBend_2(Remote_t *remote);
void RightBend_back_2(Remote_t *remote);
void LeftBend_2(Remote_t *remote);
void LeftBend_back_2(Remote_t *remote);

void TIM_start(void);
void TIM_stop(uint32_t *time);
void Motor_ALL_set(uint8_t state);
void Motor1_control(uint8_t state);
void Motor2_control(uint8_t state);
void Motor3_control(uint8_t state);
void Motor4_control(uint8_t state);
void Motor5_control(uint8_t state);
void Motor6_control(uint8_t state);


#endif
